home *** CD-ROM | disk | FTP | other *** search
- /*----------------------------------------------------------------------------
-
- prefsdlog.c
-
- This module handles the preferences dialog.
-
- Copyright © 1994-1995, Northwestern University.
-
- ----------------------------------------------------------------------------*/
-
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
-
- #include "glob.h"
- #include "prefsdlog.h"
- #include "dialog.h"
- #include "popuputil.h"
- #include "sfutil.h"
- #include "log.h"
- #include "news.h"
- #include "newswatcher.h"
- #include "strutil.h"
- #include "full.h"
- #include "drawutil.h"
- #include "memutil.h"
- #include "fileutil.h"
- #include "apputil.h"
- #include "resutil.h"
- #include "menus.h"
- #include "url.h"
- #include "ic.h"
- #include "header.h"
- #include "qsort.h"
- #include "listutil.h"
- #include "arrowpair.h"
-
-
-
- /* Items common to all topics. The kInit and kTerm items are pseudo-items
- used to intialize and terminate the topics. The OK and Cancel buttons
- are also common to all topics (item numbers 1 and 2). Items 3 through
- 7 are user items to draw the 5 segments of the gray outline. Item 8
- is the topic popup menu. Item 9 is the user item for the up and down
- arrow controls. Item 10 is the help item for help balloons. Item 11 is
- the user item to outline the OK button. */
-
- #define kInit 100
- #define kTerm 101
- #define kFirstGrayLine 3
- #define kLastGrayLine 7
- #define kTopicPopup 8
- #define kArrows 9
- #define kCommonItems 11
-
- /* Prefs dialog and DITL resources */
-
- #define kPrefsDlg 300
- #define kNewsreadingOptions 1
- #define kServerAddresses 2
- #define kServerOptions 3
- #define kPersonalInfo 4
- #define kSignature 5
- #define kMessageOptions 6
- #define kExtraHeaderLines 7
- #define kRemoteHost 8
- #define kScreenFonts 9
- #define kPrintingFont 10
- #define kSavedUserGroupLists 11
- #define kSavedArticles 12
- #define kSavedMessages 13
- #define kURLHelpers 14
- #define kAuthentication 15
- #define kExtractBinaries 16
- #define kMiscOptions 17
-
- #define kNumTopics 17
-
- /* Newsreading options topic. */
-
- #define kShowAuthors (kCommonItems + 1)
- #define kShowArtHeaders (kCommonItems + 2)
- #define kCollapseThreads (kCommonItems + 3)
- #define kKeyboardShortcuts (kCommonItems + 4)
- #define kKeypadShortcuts (kCommonItems + 5)
- #define kReuseArticleWinds (kCommonItems + 6)
- #define kReturnToSubjectWindow (kCommonItems + 7)
- #define kStopAtEndOfSubjectList (kCommonItems + 8)
- #define kBeepAtEndOfLists (kCommonItems + 9)
- #define kMaxArticles (kCommonItems + 11)
-
- /* Server info topic. */
-
- #define kNewsServer (kCommonItems + 3)
- #define kMailServer (kCommonItems + 5)
-
- /* Server options topic. */
-
- #define kBatchedGroupCmds (kCommonItems + 2)
- #define kUseXPAT (kCommonItems + 3)
- #define kNoNewConnection (kCommonItems + 4)
- #define kNoModeReader (kCommonItems + 5)
-
- /* Personal info topic. */
-
- #define kFullName (kCommonItems + 3)
- #define kOrganization (kCommonItems + 5)
- #define kMailAddress (kCommonItems + 7)
-
- /* Signature topic. */
-
- #define kSigStaticText (kCommonItems + 1)
- #define kSignatureEditText (kCommonItems + 2)
- #define kAddSigBlankLine (kCommonItems + 3)
- #define kAddSigSeparator (kCommonItems + 4)
-
- /* Message options topic. */
-
- #define kMsgReplyPost (kCommonItems + 1)
- #define kMsgReplyEmail (kCommonItems + 2)
- #define kMsgCopySelf (kCommonItems + 3)
- #define kMsgShowMsgDetails (kCommonItems + 4)
- #define kMsgWrapOnSend (kCommonItems + 5)
- #define kMsgShowLabels (kCommonItems + 6)
- #define kMsgTabEnabled (kCommonItems + 7)
- #define kMsgTabStops (kCommonItems + 9)
- #define kMsgQuoteString (kCommonItems + 11)
-
- /* Extra header lines topic */
-
- #define kMsgExtraNewsHdrLines (kCommonItems + 2)
- #define kMsgExtraMailHdrLines (kCommonItems + 4)
-
- /* Remote host info topic. */
-
- #define kRemoteHostAddr (kCommonItems + 3)
- #define kRemoteLogin (kCommonItems + 5)
- #define kRemotePassword (kCommonItems + 7)
- #define kRemotePath (kCommonItems + 9)
- #define kAutoGetPut (kCommonItems + 10)
- #define kSavePassword (kCommonItems + 11)
-
- /* Screen fonts topic. */
-
- #define kListFontPopup (kCommonItems + 2)
- #define kListSizeBox (kCommonItems + 4)
- #define kListSizePopup (kCommonItems + 5)
- #define kListSample (kCommonItems + 6)
- #define kListVertLine (kCommonItems + 7)
- #define kTextFontPopup (kCommonItems + 9)
- #define kTextSizeBox (kCommonItems + 11)
- #define kTextSizePopup (kCommonItems + 12)
- #define kTextSample (kCommonItems + 13)
-
- /* Printing font topic. */
-
- #define kPrintingFontPopup (kCommonItems + 1)
- #define kPrintingSizeBox (kCommonItems + 3)
- #define kPrintingSizePopup (kCommonItems + 4)
- #define kPrintingSample (kCommonItems + 5)
-
- /* Saved user group lists topic. */
-
- #define kSavedUGLDirCheckBox (kCommonItems + 1)
- #define kSavedUGLDirBorder (kCommonItems + 2)
- #define kSavedUGLDirName (kCommonItems + 3)
- #define kSavedUGLDirButton (kCommonItems + 4)
- #define kSavedUGLAutoSaveOnQuit (kCommonItems + 5)
-
- /* Saved articles topic. */
-
- #define kSavedArtAppBorder (kCommonItems + 2)
- #define kSavedArtAppName (kCommonItems + 3)
- #define kSavedArtAppButton (kCommonItems + 4)
- #define kSavedArtDirCheckBox (kCommonItems + 5)
- #define kSavedArtDirBorder (kCommonItems + 6)
- #define kSavedArtDirName (kCommonItems + 7)
- #define kSavedArtDirButton (kCommonItems + 8)
- #define kSavedArtSepFiles (kCommonItems + 9)
- #define kSavedArtAutoAppend (kCommonItems + 10)
- #define kSavedArtSaveEncoded (kCommonItems + 11)
-
- /* Saved messages topic. */
-
- #define kSavedMsgDirCheckBox (kCommonItems + 1)
- #define kSavedMsgDirBorder (kCommonItems + 2)
- #define kSavedMsgDirName (kCommonItems + 3)
- #define kSavedMsgDirButton (kCommonItems + 4)
- #define kSavedMsgDelAfterSend (kCommonItems + 5)
-
- /* URL helper programs topic. */
-
- #define kURLList (kCommonItems + 1)
- #define kURLChangeButton (kCommonItems + 2)
- #define kURLDeleteButton (kCommonItems + 3)
- #define kURLNewScheme (kCommonItems + 5)
- #define kURLAddButton (kCommonItems + 6)
- #define kURLUseWebHelper (kCommonItems + 7)
-
- /* Authentication topic. */
-
- #define kAuthUsername (kCommonItems + 3)
- #define kAuthPassword (kCommonItems + 5)
- #define kAuthSavePassword (kCommonItems + 6)
- #define kAuthPrivateGroups (kCommonItems + 7)
- #define kAuthWhenRequested (kCommonItems + 8)
- #define kAuthAtStartup (kCommonItems + 9)
-
- /* Extracting Binaries topic. */
-
- #define kSavedBinDirCheckBox (kCommonItems + 1)
- #define kSavedBinDirBorder (kCommonItems + 2)
- #define kSavedBinDirName (kCommonItems + 3)
- #define kSavedBinDirButton (kCommonItems + 4)
- #define kHqxAppBorder (kCommonItems + 6)
- #define kHqxAppName (kCommonItems + 7)
- #define kHqxAppButton (kCommonItems + 8)
- #define kUUAppBorder (kCommonItems + 10)
- #define kUUAppName (kCommonItems + 11)
- #define kUUAppButton (kCommonItems + 12)
-
- /* Miscellaneous options topic. */
-
- #define kReZoomWindows (kCommonItems + 1)
- #define kCheckNewGroups (kCommonItems + 2)
- #define kAreYouSure (kCommonItems + 3)
- #define kLogActionsToFile (kCommonItems + 4)
- #define kDontCoverFinderIcons (kCommonItems + 5)
- #define kUseInternetConfig (kCommonItems + 6)
-
-
-
- static short gItem; /* dialog item number hit */
-
- static ArrowPairRef gArrowPair = nil; /* arrow pair reference */
-
- static Str255 gStaticText; /* static text for signature dialog */
-
- static short gListFontID; /* current list font id */
- static short gListFontSize; /* current list font size */
- static short gTextFontID; /* current text font id */
- static short gTextFontSize; /* current text font size */
- static short gPrintingFontID; /* current printing font id */
- static short gPrintingFontSize; /* current printing font size */
-
- static ListHandle gURLList; /* handle to list of URL helpers */
-
- static Boolean gScreenFontsTopic; /* true if screen fonts topic, false if printing font topic */
-
- static FileFilterYDUPP gInvisibleFilesFilterUPP = nil;
- static UserItemUPP gDrawFontSampleUPP = nil;
- static UserItemUPP gDlgArrowsItemUPP = nil;
- static UserItemUPP gDrawURLListUPP = nil;
-
-
-
- /*----------------------------------------------------------------------------
- ValidHelper
-
- Check for a valid helper program.
-
- Entry: fSpec = pointer to helper program file spec.
-
- Exit: function result = true if helper is valid.
- *fSpec = pointer to file spec for copy of helper program which
- will actually be used if duplicate copies of helper found.
- ----------------------------------------------------------------------------*/
-
- static Boolean ValidHelper (FSSpec *fSpec)
- {
- OSErr err = noErr;
- FInfo fInfo;
- FSSpec file;
- CStr255 fmt, msg;
-
- err = FSpGetFInfo(fSpec, &fInfo);
- if (err != noErr) goto exit1;
- if (fInfo.fdType != 'APPL') goto exit2;
- err = FindAppFromSig(fInfo.fdCreator, &file, nil, nil);
- if (err == fnfErr) goto exit3;
- if (err != noErr) goto exit1;
- if (!IsEqualFSSpec(fSpec, &file)) goto exit4;
- return true;
-
- exit1:
-
- GetCString(kStrUnexpectedErr, fmt);
- sprintf(msg, fmt, err);
- StopAlertMessage(msg);
- return false;
-
- exit2:
-
- StopAlertNumber(kStrNotAnApplication);
- return false;
-
- exit3:
-
- StopAlertNumber(kStrDesktopDatabaseDamaged);
- return true;
-
- exit4:
-
- CautionAlertNumber(kStrDuplicateCopiesOfHelper);
- *fSpec = file;
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- NewsreadingOptions
-
- Handle the newsreading options preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean NewsreadingOptions (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- long maxFetch;
-
- switch (item) {
-
- case kInit:
-
- DlgSetCheck(dlg, kShowAuthors, prefs->showAuthors);
- DlgSetCheck(dlg, kShowArtHeaders, prefs->showArtHeaders);
- DlgSetCheck(dlg, kCollapseThreads, prefs->showThreadsCollapsed);
- DlgSetCheck(dlg, kKeyboardShortcuts, prefs->keyboardShortcuts);
- DlgSetCheck(dlg, kKeypadShortcuts, prefs->keypadShortcuts);
- DlgSetCheck(dlg, kReuseArticleWinds, prefs->reuseArticleWinds);
- DlgSetCheck(dlg, kReturnToSubjectWindow, prefs->returnToSubjectWindow);
- DlgSetCheck(dlg, kStopAtEndOfSubjectList, prefs->stopAtEndOfSubjectList);
- DlgSetCheck(dlg, kBeepAtEndOfLists, prefs->beepAtEndOfLists);
- DlgSetNumber(dlg, kMaxArticles, prefs->maxFetch);
- SetItemNumeric(dlg, kMaxArticles);
- SetItemMaxLength(dlg, kMaxArticles, 5);
- SelectDialogItemText(dlg, kMaxArticles, 0, 0x7fff);
- break;
-
- case kTerm:
-
- prefs->showAuthors = DlgGetCheck(dlg, kShowAuthors);
- prefs->showArtHeaders = DlgGetCheck(dlg, kShowArtHeaders);
- prefs->showThreadsCollapsed = DlgGetCheck(dlg, kCollapseThreads);
- prefs->keyboardShortcuts = DlgGetCheck(dlg, kKeyboardShortcuts);
- prefs->keypadShortcuts = DlgGetCheck(dlg, kKeypadShortcuts);
- prefs->reuseArticleWinds = DlgGetCheck(dlg, kReuseArticleWinds);
- prefs->returnToSubjectWindow = DlgGetCheck(dlg, kReturnToSubjectWindow);
- prefs->stopAtEndOfSubjectList = DlgGetCheck(dlg, kStopAtEndOfSubjectList);
- prefs->beepAtEndOfLists = DlgGetCheck(dlg, kBeepAtEndOfLists);
- maxFetch = DlgGetNumber(dlg, kMaxArticles);
- if (maxFetch > 15000) maxFetch = 15000;
- if (maxFetch <= 0) maxFetch = 1;
- prefs->maxFetch = maxFetch;
- break;
-
- case kShowAuthors:
- case kShowArtHeaders:
- case kCollapseThreads:
- case kKeyboardShortcuts:
- case kKeypadShortcuts:
- case kReuseArticleWinds:
- case kReturnToSubjectWindow:
- case kStopAtEndOfSubjectList:
- case kBeepAtEndOfLists:
-
- DlgToggleCheck(dlg, item);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- Server
-
- Handles the server info preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean Server (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- Boolean enable;
-
- switch (item) {
-
- case kInit:
-
- DlgSetPString(dlg, kNewsServer, prefs->newsServerName);
- SetItemHostAddress(dlg, kNewsServer);
- SetItemMaxLength(dlg, kNewsServer, 255);
- DlgSetPString(dlg, kMailServer, prefs->mailServerName);
- SetItemHostAddress(dlg, kMailServer);
- SetItemMaxLength(dlg, kMailServer, 255);
- if (*prefs->newsServerName == 0) {
- SelectDialogItemText(dlg, kNewsServer, 0, 0);
- } else if (*prefs->mailServerName == 0) {
- SelectDialogItemText(dlg, kMailServer, 0, 0);
- } else {
- SelectDialogItemText(dlg, kNewsServer, 0, 0x7fff);
- }
- break;
-
- case kTerm:
-
- break;
-
- case kNewsServer:
- case kMailServer:
-
- DlgGetPString(dlg, kNewsServer, prefs->newsServerName);
- DlgGetPString(dlg, kMailServer, prefs->mailServerName);
- enable = *prefs->newsServerName != 0 && *prefs->mailServerName != 0;
- DlgEnableItem(dlg, ok, enable);
- DlgEnableItem(dlg, kTopicPopup, enable);
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- ServerOptions
-
- Handles the server options preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean ServerOptions (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- switch (item) {
-
- case kInit:
-
- DlgSetCheck(dlg, kBatchedGroupCmds, prefs->batchedGroupCmds);
- DlgSetCheck(dlg, kUseXPAT, prefs->useXPAT);
- DlgSetCheck(dlg, kNoNewConnection, prefs->noNewConnection);
- DlgSetCheck(dlg, kNoModeReader, prefs->noModeReader);
- break;
-
- case kTerm:
-
- prefs->batchedGroupCmds = DlgGetCheck(dlg, kBatchedGroupCmds);
- prefs->useXPAT = DlgGetCheck(dlg, kUseXPAT);
- prefs->noNewConnection = DlgGetCheck(dlg, kNoNewConnection);
- prefs->noModeReader = DlgGetCheck(dlg, kNoModeReader);
- break;
-
- case kBatchedGroupCmds:
- case kUseXPAT:
- case kNoNewConnection:
- case kNoModeReader:
-
- DlgToggleCheck(dlg, item);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- Personal
-
- Handles the personal info preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean Personal (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- switch (item) {
-
- case kInit:
-
- DlgSetCString(dlg, kFullName, prefs->fullName);
- SetItemMaxLength(dlg, kFullName, 255);
- DlgSetCString(dlg, kOrganization, prefs->organization);
- SetItemMaxLength(dlg, kOrganization, 255);
- DlgSetCString(dlg, kMailAddress, prefs->emailAddress);
- SetItemUSAsciiNoBlank(dlg, kMailAddress);
- SetItemMaxLength(dlg, kMailAddress, 255);
- if (*prefs->fullName == 0) {
- SelectDialogItemText(dlg, kFullName, 0, 0);
- } else if (*prefs->organization == 0) {
- SelectDialogItemText(dlg, kOrganization, 0, 0);
- } else if (*prefs->emailAddress == 0) {
- SelectDialogItemText(dlg, kMailAddress, 0, 0);
- } else {
- SelectDialogItemText(dlg, kFullName, 0, 0x7fff);
- }
- break;
-
- case kTerm:
-
- if (gItem != cancel && !StringIsValidEmailAddress(prefs->emailAddress)) {
- StopAlertNumber(kStrBadEmailAddress);
- return false;
- }
- DlgGetCString(dlg, kFullName, prefs->fullName);
- DlgGetCString(dlg, kOrganization, prefs->organization);
- break;
-
- case kMailAddress:
-
- DlgGetCString(dlg, kMailAddress, prefs->emailAddress);
- DlgEnableItem(dlg, ok, *prefs->emailAddress != 0);
- DlgEnableItem(dlg, kTopicPopup, *prefs->emailAddress != 0);
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- Signature
-
- Handles the signature preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean Signature (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- short len;
-
- switch (item) {
-
- case kInit:
-
- DlgSetCheck(dlg, kAddSigBlankLine, prefs->addSigBlankLine);
- DlgSetCheck(dlg, kAddSigSeparator, prefs->addSigSeparatorLine);
- SetItemScrollingTextField(dlg, kSignatureEditText,
- prefs->textFont, prefs->textSize, false);
- DlgSetScrollingText(dlg, kSignatureEditText, prefs->signature,
- strlen(prefs->signature));
- DlgSetScrollingTextSelection(dlg, kSignatureEditText, 0, 0);
- SetItemMaxLength(dlg, kSignatureEditText, 4095);
- break;
-
- case kTerm:
-
- prefs->addSigBlankLine = DlgGetCheck(dlg, kAddSigBlankLine);
- prefs->addSigSeparatorLine = DlgGetCheck(dlg, kAddSigSeparator);
- DlgGetScrollingText(dlg, kSignatureEditText, prefs->signature, &len);
- prefs->signature[len] = 0;
- break;
-
- case kAddSigBlankLine:
- case kAddSigSeparator:
-
- DlgToggleCheck(dlg, item);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MessageOptions
-
- Handles the message options preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean MessageOptions (TPrefRec *prefs, DialogPtr dlg, short item)
- {
-
- switch (item) {
-
- case kInit:
-
- DlgSetCheck(dlg, kMsgReplyPost, prefs->replyPost);
- DlgSetCheck(dlg, kMsgReplyEmail, prefs->replyEmail);
- DlgSetCheck(dlg, kMsgCopySelf, prefs->copySelf);
- DlgSetCheck(dlg, kMsgShowMsgDetails, prefs->showMsgDetails);
- DlgSetCheck(dlg, kMsgWrapOnSend, prefs->wrapOnSend);
- DlgSetCheck(dlg, kMsgShowLabels, prefs->showLabelsUnderIcons);
- DlgSetCheck(dlg, kMsgTabEnabled, prefs->tabEnabled);
- DlgSetNumber(dlg, kMsgTabStops, prefs->tabStops);
- SetItemNumeric(dlg, kMsgTabStops);
- SetItemMaxLength(dlg, kMsgTabStops, 2);
- SelectDialogItemText(dlg, kMsgTabStops, 0, 0x7fff);
- DlgSetCString(dlg, kMsgQuoteString, prefs->quoteString);
- SetItemMaxLength(dlg, kMsgQuoteString, 10);
- break;
-
- case kTerm:
-
- prefs->replyPost = DlgGetCheck(dlg, kMsgReplyPost);
- prefs->replyEmail = DlgGetCheck(dlg, kMsgReplyEmail);
- prefs->copySelf = DlgGetCheck(dlg, kMsgCopySelf);
- prefs->showMsgDetails = DlgGetCheck(dlg, kMsgShowMsgDetails);
- prefs->wrapOnSend = DlgGetCheck(dlg, kMsgWrapOnSend);
- prefs->showLabelsUnderIcons = DlgGetCheck(dlg, kMsgShowLabels);
- prefs->tabEnabled = DlgGetCheck(dlg, kMsgTabEnabled);
- prefs->tabStops = DlgGetNumber(dlg, kMsgTabStops);
- DlgGetCString(dlg, kMsgQuoteString, prefs->quoteString);
- break;
-
- case kMsgReplyPost:
- case kMsgReplyEmail:
- case kMsgCopySelf:
- case kMsgShowMsgDetails:
- case kMsgWrapOnSend:
- case kMsgShowLabels:
- case kMsgTabEnabled:
-
- DlgToggleCheck(dlg, item);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- ExtraHeaderLines
-
- Handles the extra header lines preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean ExtraHeaderLines (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- short len;
-
- switch (item) {
-
- case kInit:
-
- SetItemScrollingTextField(dlg, kMsgExtraNewsHdrLines,
- prefs->textFont, prefs->textSize, false);
- DlgSetScrollingText(dlg, kMsgExtraNewsHdrLines, prefs->extraNewsHdrLines,
- strlen(prefs->extraNewsHdrLines));
- SetItemMaxLength(dlg, kMsgExtraNewsHdrLines, 255);
- SetItemScrollingTextField(dlg, kMsgExtraMailHdrLines,
- prefs->textFont, prefs->textSize, false);
- DlgSetScrollingText(dlg, kMsgExtraMailHdrLines, prefs->extraMailHdrLines,
- strlen(prefs->extraMailHdrLines));
- SetItemMaxLength(dlg, kMsgExtraMailHdrLines, 255);
- DlgSetScrollingTextSelection(dlg, kMsgExtraNewsHdrLines, 0, 0);
- break;
-
- case kTerm:
-
- DlgGetScrollingText(dlg, kMsgExtraNewsHdrLines, prefs->extraNewsHdrLines, &len);
- prefs->extraNewsHdrLines[len] = 0;
- DlgGetScrollingText(dlg, kMsgExtraMailHdrLines, prefs->extraMailHdrLines, &len);
- prefs->extraMailHdrLines[len] = 0;
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- Remote
-
- Handles the remote host info preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean Remote (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- CStr255 tempStr;
- short len;
-
- switch (item) {
-
- case kInit:
-
- DlgSetCString(dlg, kRemoteHostAddr, prefs->ftpNewsrcHost);
- SetItemHostAddress(dlg, kRemoteHostAddr);
- SetItemMaxLength(dlg, kRemoteHostAddr, 255);
- DlgSetCString(dlg, kRemoteLogin, prefs->ftpNewsrcUsername);
- SetItemUSAsciiNoBlank(dlg, kRemoteLogin);
- SetItemMaxLength(dlg, kRemoteLogin, 255);
- len = strlen(prefs->ftpNewsrcPassword);
- memset(tempStr, '•', len);
- tempStr[len] = 0;
- DlgSetCString(dlg, kRemotePassword, tempStr);
- SetItemPassword(dlg, kRemotePassword, prefs->ftpNewsrcPassword);
- SetItemMaxLength(dlg, kRemotePassword, 31);
- DlgSetCString(dlg, kRemotePath, prefs->ftpNewsrcPath);
- SetItemMaxLength(dlg, kRemotePath, 31);
- DlgSetCheck(dlg, kAutoGetPut, prefs->autoFetchNewsrc);
- DlgSetCheck(dlg, kSavePassword, prefs->saveFtpNewsrcPassword);
- if (*prefs->ftpNewsrcHost == 0) {
- SelectDialogItemText(dlg, kRemoteHostAddr, 0, 0);
- } else if (*prefs->ftpNewsrcUsername == 0) {
- SelectDialogItemText(dlg, kRemoteLogin, 0, 0);
- } else if (*prefs->ftpNewsrcPassword == 0) {
- SelectDialogItemText(dlg, kRemotePassword, 0, 0);
- } else if (*prefs->ftpNewsrcPath == 0) {
- SelectDialogItemText(dlg, kRemotePath, 0, 0);
- } else {
- SelectDialogItemText(dlg, kRemoteHostAddr, 0, 0x7fff);
- }
- break;
-
- case kTerm:
-
- DlgGetCString(dlg, kRemoteHostAddr, prefs->ftpNewsrcHost);
- DlgGetCString(dlg, kRemoteLogin, prefs->ftpNewsrcUsername);
- DlgGetCString(dlg, kRemotePath, prefs->ftpNewsrcPath);
- prefs->autoFetchNewsrc = DlgGetCheck(dlg, kAutoGetPut);
- prefs->saveFtpNewsrcPassword = DlgGetCheck(dlg, kSavePassword);
- break;
-
- case kSavePassword:
- case kAutoGetPut:
-
- DlgToggleCheck(dlg, item);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- DrawFontSample
-
- A user item procedure to draw the font samples.
-
- Entry: dlg = pointer to dialog.
- item = item number.
- ----------------------------------------------------------------------------*/
-
- static pascal void DrawFontSample (DialogPtr dlg, short item)
- {
- short itemType;
- Rect box;
- Handle itemHandle;
- Str255 text;
- short fontID, fontSize;
- TextStyle savedStyle;
-
- DlgGrayBorderItem(dlg, item);
- GetDialogItem(dlg, item, &itemType, &itemHandle, &box);
- if (gScreenFontsTopic) {
- if (item == kListSample) {
- GetPString(kStrGroupSubjectSample, text);
- fontID = gListFontID;
- fontSize = gListFontSize;
- } else {
- GetPString(kStrArtMsgSample, text);
- fontID = gTextFontID;
- fontSize = gTextFontSize;
- }
- } else {
- GetPString(kStrPrintingSample, text);
- fontID = gPrintingFontID;
- fontSize = gPrintingFontSize;
- }
- GetPortTextStyle(&savedStyle);
- TextFont(fontID);
- TextSize(fontSize);
- InsetRect(&box, 2, 2);
- TETextBox(text + 1, *text, &box, teFlushDefault);
- SetPortTextStyle(&savedStyle);
- }
-
-
-
- /*----------------------------------------------------------------------------
- RedrawSample
-
- Force one of the sample text items to be redrawn.
-
- Entry: dlg = pointer to dialog.
- item = item number.
- ----------------------------------------------------------------------------*/
-
- static void RedrawSample (DialogPtr dlg, short item)
- {
- short itemType;
- Handle itemHandle;
- Rect box;
-
- GetDialogItem(dlg, item, &itemType, &itemHandle, &box);
- InsetRect(&box, 2, 2);
- EraseRect(&box);
- InvalRect(&box);
- }
-
-
-
- /*----------------------------------------------------------------------------
- SetNewFont
-
- Set a new font in the font/size dialog.
-
- Entry: dlg = pointer to dialog.
- listFont = true if list font, false if text font.
- fontNum = new font number.
- ----------------------------------------------------------------------------*/
-
- static void SetNewFont (DialogPtr dlg, Boolean listFont, short fontNum)
- {
- short numItems, i;
- Str255 itemStr, fontName;
- ControlHandle ctl;
- long size;
-
- /* Select the right font in the font popup menu. */
-
- ctl = DlgGetControl(dlg,
- gScreenFontsTopic ? (listFont ? kListFontPopup : kTextFontPopup) : kPrintingFontPopup);
- GetFontName(fontNum, fontName);
- SetPopupValue(ctl, fontName, false);
-
- /* Adjust the size popup so the nice sizes are outlined. */
-
- ctl = DlgGetControl(dlg,
- gScreenFontsTopic ? (listFont ? kListSizePopup : kTextSizePopup) : kPrintingSizePopup);
- numItems = GetControlMaximum(ctl);
- for (i = 1; i <= numItems; i++) {
- GetPopupPString(ctl, i, itemStr);
- StringToNum(itemStr, &size);
- if (RealFont(fontNum, (short)size)) {
- SetPopupItemStyle(ctl, i, outline);
- } else {
- SetPopupItemStyle(ctl, i, 0);
- }
- }
-
- /* Force the sample text to be redrawn */
-
- RedrawSample(dlg,
- gScreenFontsTopic ? (listFont ? kListSample : kTextSample) : kPrintingSample);
- }
-
-
-
- /*----------------------------------------------------------------------------
- FontIDFromPopup
-
- Get the font ID corresponding the currently selected font in a popup menu.
-
- Entry: dlg = pointer to dialog.
- item = item number of popup menu.
- ----------------------------------------------------------------------------*/
-
- static short FontIDFromPopup (DialogPtr dlg, short item)
- {
- ControlHandle ctl;
- short fontNum;
- Str255 fontName;
-
- ctl = DlgGetControl(dlg, item);
- GetPopupPString(ctl, kCurrentPopupItem, fontName);
- GetFontNumber(fontName, &fontNum);
- return fontNum;
- }
-
-
-
- /*----------------------------------------------------------------------------
- ScreenFonts
-
- Handles the screen fonts preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean ScreenFonts (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- Str255 tempStr;
- long num;
-
- switch (item) {
-
- case kInit:
-
- gScreenFontsTopic = true;
- GetFontNumber(prefs->listFont, &gListFontID);
- gListFontSize = prefs->listSize;
- SetNewFont(dlg, true, gListFontID);
- DlgSetNumber(dlg, kListSizeBox, gListFontSize);
- SetItemNumeric(dlg, kListSizeBox);
- SetItemMaxLength(dlg, kListSizeBox, 2);
- SelectDialogItemText(dlg, kListSizeBox, 0, 0x7fff);
- SetItemPopupTypeinItem(dlg, kListSizePopup, kListSizeBox);
-
- GetFontNumber(prefs->textFont, &gTextFontID);
- gTextFontSize = prefs->textSize;
- SetNewFont(dlg, false, gTextFontID);
- DlgSetNumber(dlg, kTextSizeBox, gTextFontSize);
- SetItemNumeric(dlg, kTextSizeBox);
- SetItemMaxLength(dlg, kTextSizeBox, 2);
- SetItemPopupTypeinItem(dlg, kTextSizePopup, kTextSizeBox);
-
- DlgSetUserItem(dlg, kListSample, gDrawFontSampleUPP);
- DlgSetUserItem(dlg, kTextSample, gDrawFontSampleUPP);
- DlgSetUserItem(dlg, kListVertLine, gDlgGrayBorderItemUPP);
- break;
-
- case kTerm:
-
- GetFontName(gListFontID, prefs->listFont);
- GetFontName(gTextFontID, prefs->textFont);
- prefs->listSize = gListFontSize;
- prefs->textSize = gTextFontSize;
- break;
-
- case kListFontPopup:
-
- gListFontID = FontIDFromPopup(dlg, item);
- SetNewFont(dlg, true, gListFontID);
- break;
-
- case kTextFontPopup:
-
- gTextFontID = FontIDFromPopup(dlg, item);
- SetNewFont(dlg, false, gTextFontID);
- break;
-
- case kListSizePopup:
- case kListSizeBox:
-
- DlgGetPString(dlg, kListSizeBox, tempStr);
- StringToNum(tempStr, &num);
- if (num != 0 && num != gListFontSize) {
- gListFontSize = num;
- RedrawSample(dlg, kListSample);
- }
- break;
-
- case kTextSizePopup:
- case kTextSizeBox:
-
- DlgGetPString(dlg, kTextSizeBox, tempStr);
- StringToNum(tempStr, &num);
- if (num != 0 && num != gTextFontSize) {
- gTextFontSize = num;
- RedrawSample(dlg, kTextSample);
- }
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- PrintingFont
-
- Handles the printing font preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean PrintingFont (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- Str255 tempStr;
- long num;
-
- switch (item) {
-
- case kInit:
-
- gScreenFontsTopic = false;
- GetFontNumber(prefs->printingFont, &gPrintingFontID);
- gPrintingFontSize = prefs->printingSize;
- SetNewFont(dlg, true, gPrintingFontID);
- DlgSetNumber(dlg, kPrintingSizeBox, gPrintingFontSize);
- SetItemNumeric(dlg, kPrintingSizeBox);
- SetItemMaxLength(dlg, kPrintingSizeBox, 2);
- SelectDialogItemText(dlg, kPrintingSizeBox, 0, 0x7fff);
- SetItemPopupTypeinItem(dlg, kPrintingSizePopup, kPrintingSizeBox);
- DlgSetUserItem(dlg, kPrintingSample, gDrawFontSampleUPP);
- break;
-
- case kTerm:
-
- GetFontName(gPrintingFontID, prefs->printingFont);
- prefs->printingSize = gPrintingFontSize;
- break;
-
- case kPrintingFontPopup:
-
- gPrintingFontID = FontIDFromPopup(dlg, item);
- SetNewFont(dlg, true, gPrintingFontID);
- break;
-
- case kPrintingSizePopup:
- case kPrintingSizeBox:
-
- DlgGetPString(dlg, kPrintingSizeBox, tempStr);
- StringToNum(tempStr, &num);
- if (num != 0 && num != gPrintingFontSize) {
- gPrintingFontSize = num;
- RedrawSample(dlg, kPrintingSample);
- }
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- SavedUGL
-
- Handles the saved user group lists preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean SavedUGL (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- StandardFileReply reply;
- long dirID;
- Str31 name;
- OSErr err = noErr;
- CInfoPBRec pb;
- Boolean valid;
- AliasHandle alias;
-
- switch (item) {
-
- case kInit:
-
- DlgSetCheck(dlg, kSavedUGLDirCheckBox, prefs->savedUGLDefaultFolder);
- DlgSetUserItem(dlg, kSavedUGLDirBorder, gDlgGrayBorderItemUPP);
- ValidateSavedFolderAlias(prefs->savedUGLDefaultFolderAlias,
- &pb.dirInfo.ioVRefNum, &pb.dirInfo.ioDrDirID, &valid);
- if (valid) {
- pb.dirInfo.ioNamePtr = name;
- pb.dirInfo.ioFDirIndex = -1;
- err = PBGetCatInfo(&pb, false);
- } else {
- *name = 0;
- }
- DlgSetPString(dlg, kSavedUGLDirName, name);
- DlgEnableItem(dlg, kSavedUGLDirButton, prefs->savedUGLDefaultFolder);
- DlgSetCheck(dlg, kSavedUGLAutoSaveOnQuit, prefs->autoSaveOnQuit);
-
- break;
-
- case kTerm:
-
- prefs->autoSaveOnQuit = DlgGetCheck(dlg, kSavedUGLAutoSaveOnQuit);
- break;
-
- case kSavedUGLDirCheckBox:
-
- DlgToggleCheck(dlg, item);
- prefs->savedUGLDefaultFolder = DlgGetCheck(dlg, item);
- DlgEnableItem(dlg, kSavedUGLDirButton, prefs->savedUGLDefaultFolder);
- break;
-
- case kSavedUGLDirButton:
-
- MyStandardGetDirectory(&reply, &dirID);
- if (!reply.sfGood) break;
- err = NewAlias(nil, &reply.sfFile, &alias);
- if (err == noErr) {
- MyDisposeHandle(prefs->savedUGLDefaultFolderAlias);
- prefs->savedUGLDefaultFolderAlias = alias;
- }
- DlgSetPString(dlg, kSavedUGLDirName, reply.sfFile.name);
- break;
-
- case kSavedUGLAutoSaveOnQuit:
-
- DlgToggleCheck(dlg, item);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- InvisibleFilesFilter
-
- A standard file dialog filter to filter out invisible files.
-
- Entry: pb = pointer to file info param block.
- myDataPtr = pointer to private data (not used).
-
- Exit: function result = true if file is invisible.
- ----------------------------------------------------------------------------*/
-
- static pascal Boolean InvisibleFilesFilter (CInfoPBPtr pb, void *myDataPtr)
- {
- return (pb->hFileInfo.ioFlFndrInfo.fdFlags & fInvisible) != 0;
- }
-
-
-
- /*----------------------------------------------------------------------------
- SavedArt
-
- Handles the saved articles preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean SavedArt (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- StandardFileReply reply;
- FInfo fInfo;
- long dirID;
- Str31 name;
- OSErr err = noErr;
- CInfoPBRec pb;
- Boolean valid;
- AliasHandle alias;
-
- switch (item) {
-
- case kInit:
-
- DlgSetUserItem(dlg, kSavedArtAppBorder, gDlgGrayBorderItemUPP);
- err = FindAppNameFromSig(prefs->savedArtCreator, name);
- if (err == noErr) {
- DlgSetPString(dlg, kSavedArtAppName, name);
- CopyPascalString(prefs->savedArtAppName, name);
- } else {
- DlgSetPString(dlg, kSavedArtAppName, prefs->savedArtAppName);
- }
- DlgSetCheck(dlg, kSavedArtDirCheckBox, prefs->savedArtDefaultFolder);
- DlgSetUserItem(dlg, kSavedArtDirBorder, gDlgGrayBorderItemUPP);
- ValidateSavedFolderAlias(prefs->savedArtDefaultFolderAlias,
- &pb.dirInfo.ioVRefNum, &pb.dirInfo.ioDrDirID, &valid);
- if (valid) {
- pb.dirInfo.ioNamePtr = name;
- pb.dirInfo.ioFDirIndex = -1;
- err = PBGetCatInfo(&pb, false);
- } else {
- *name = 0;
- }
- DlgSetPString(dlg, kSavedArtDirName, name);
- DlgEnableItem(dlg, kSavedArtDirButton, prefs->savedArtDefaultFolder);
- DlgSetCheck(dlg, kSavedArtSepFiles, prefs->saveThreadsToSeparateFiles);
- DlgSetCheck(dlg, kSavedArtAutoAppend, prefs->appendIfFileAlreadyExists);
- DlgSetCheck(dlg, kSavedArtSaveEncoded, prefs->saveEncodedText);
-
- break;
-
- case kTerm:
-
- prefs->saveThreadsToSeparateFiles = DlgGetCheck(dlg, kSavedArtSepFiles);
- prefs->appendIfFileAlreadyExists = DlgGetCheck(dlg, kSavedArtAutoAppend);
- prefs->saveEncodedText = DlgGetCheck(dlg, kSavedArtSaveEncoded);
- break;
-
- case kSavedArtAppButton:
-
- MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
- if (!reply.sfGood) break;
- FSpGetFInfo(&reply.sfFile, &fInfo);
- prefs->savedArtCreator = fInfo.fdCreator;
- CopyPascalString(prefs->savedArtAppName, reply.sfFile.name);
- DlgSetPString(dlg, kSavedArtAppName, prefs->savedArtAppName);
- break;
-
- case kSavedArtDirCheckBox:
-
- DlgToggleCheck(dlg, item);
- prefs->savedArtDefaultFolder = DlgGetCheck(dlg, item);
- DlgEnableItem(dlg, kSavedArtDirButton, prefs->savedArtDefaultFolder);
- break;
-
- case kSavedArtDirButton:
-
- MyStandardGetDirectory(&reply, &dirID);
- if (!reply.sfGood) break;
- err = NewAlias(nil, &reply.sfFile, &alias);
- if (err == noErr) {
- MyDisposeHandle(prefs->savedArtDefaultFolderAlias);
- prefs->savedArtDefaultFolderAlias = alias;
- }
- DlgSetPString(dlg, kSavedArtDirName, reply.sfFile.name);
- break;
-
- case kSavedArtSepFiles:
- case kSavedArtAutoAppend:
- case kSavedArtSaveEncoded:
-
- DlgToggleCheck(dlg, item);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- SavedMsg
-
- Handles the saved messages preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean SavedMsg (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- StandardFileReply reply;
- long dirID;
- Str31 name;
- OSErr err = noErr;
- CInfoPBRec pb;
- Boolean valid;
- AliasHandle alias;
-
- switch (item) {
-
- case kInit:
-
- DlgSetCheck(dlg, kSavedMsgDirCheckBox, prefs->savedMsgDefaultFolder);
- DlgSetUserItem(dlg, kSavedMsgDirBorder, gDlgGrayBorderItemUPP);
- ValidateSavedFolderAlias(prefs->savedMsgDefaultFolderAlias,
- &pb.dirInfo.ioVRefNum, &pb.dirInfo.ioDrDirID, &valid);
- if (valid) {
- pb.dirInfo.ioNamePtr = name;
- pb.dirInfo.ioFDirIndex = -1;
- err = PBGetCatInfo(&pb, false);
- } else {
- *name = 0;
- }
- DlgSetPString(dlg, kSavedMsgDirName, name);
- DlgEnableItem(dlg, kSavedMsgDirButton, prefs->savedMsgDefaultFolder);
- DlgSetCheck(dlg, kSavedMsgDelAfterSend, prefs->savedMsgDelAfterSend);
-
- break;
-
- case kTerm:
-
- break;
-
- case kSavedMsgDirCheckBox:
-
- DlgToggleCheck(dlg, item);
- prefs->savedMsgDefaultFolder = DlgGetCheck(dlg, item);
- DlgEnableItem(dlg, kSavedMsgDirButton, prefs->savedMsgDefaultFolder);
- break;
-
- case kSavedMsgDirButton:
-
- MyStandardGetDirectory(&reply, &dirID);
- if (!reply.sfGood) break;
- err = NewAlias(nil, &reply.sfFile, &alias);
- if (err == noErr) {
- MyDisposeHandle(prefs->savedMsgDefaultFolderAlias);
- prefs->savedMsgDefaultFolderAlias = alias;
- }
- DlgSetPString(dlg, kSavedMsgDirName, reply.sfFile.name);
- break;
-
- case kSavedMsgDelAfterSend:
-
- DlgToggleCheck(dlg, item);
- prefs->savedMsgDelAfterSend = DlgGetCheck(dlg, item);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- DrawURLList
-
- A user item procedure to draw the URL helper list.
-
- Entry: dlg = pointer to dialog.
- item = item number.
- ----------------------------------------------------------------------------*/
-
- static pascal void DrawURLList (DialogPtr dlg, short item)
- {
- short itemType;
- Rect box;
- Handle itemHandle;
-
- GetDialogItem(dlg, item, &itemType, &itemHandle, &box);
- FrameRect(&box);
- LUpdate(dlg->visRgn, gURLList);
- }
-
-
-
- /*----------------------------------------------------------------------------
- SetNewURLHelper
-
- Set a new URL helper.
-
- Entry: prefs = pointer to new prefs.
- ----------------------------------------------------------------------------*/
-
- static void SetNewURLHelper (TPrefRec *prefs)
- {
- Point cell;
- TURLHelperInfo *p;
- char appName[32];
- CStr255 str;
- short i;
- StandardFileReply reply;
-
- i = GetFirstSelectedCell(gURLList);
- if (i < 0) return;
- MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
- if (!reply.sfGood) return;
- if (!ValidHelper(&reply.sfFile)) return;
- MyHLock(prefs->urlHelpers);
- p = &(*prefs->urlHelpers)[i];
- if (ValidURLHelper(&reply.sfFile, p)) {
- SetPt(&cell, 0, i);
- *appName = 0;
- if (p->sig != 0) FindAppNameFromSig(p->sig, (StringPtr)appName);
- p2cstr((StringPtr)appName);
- sprintf(str, "%s — %s", p->schemeName, appName);
- LSetCell(str, strlen(str), cell, gURLList);
- }
- MyHUnlock(prefs->urlHelpers);
- }
-
-
-
- /*----------------------------------------------------------------------------
- AdjustURLButtons
-
- Adjust (enable/disable) the Change, Delete, and Add buttons in the URL
- helper programs topic.
-
- Entry: dlg = pointer to dialog.
- ----------------------------------------------------------------------------*/
-
- static void AdjustURLButtons (DialogPtr dlg)
- {
- short i;
- TURLSchemeName schemeName;
-
- i = GetFirstSelectedCell(gURLList);
- DlgEnableItem(dlg, kURLChangeButton, i >= 0);
- DlgEnableItem(dlg, kURLDeleteButton, i >= 0);
- DlgGetCString(dlg, kURLNewScheme, schemeName);
- DlgEnableItem(dlg, kURLAddButton, *schemeName != 0);
- }
-
-
-
- /*----------------------------------------------------------------------------
- CompareURLHelperInfo
-
- Compare two URL helper program info records.
-
- Entry: a = pointer to first helper program info record.
- b = pointer to second helper program info record.
-
- Exit: function result =
- -1 if a->schemeName < b->schemName
- 0 if a->schemeName = b->schemName
- +1 if a->schemeName > b->schemName
- ----------------------------------------------------------------------------*/
-
- static OSErr CompareURLHelperInfo (TURLHelperInfo *a, TURLHelperInfo *b, short *result)
- {
- *result = MyStrCmp(a->schemeName, b->schemeName);
- return noErr;
- }
-
-
- /*----------------------------------------------------------------------------
- URLScrollIntoView
-
- Scroll the selected cell into view in the URL topic.
- ----------------------------------------------------------------------------*/
-
- static void URLScrollIntoView (void)
- {
- Cell cell;
- short top, bot;
-
- cell.h = 0;
- cell.v = GetFirstSelectedCell(gURLList);
- if (cell.v < 0) return;
- top = (**gURLList).visible.top;
- bot = (**gURLList).visible.bottom;
- if (cell.v < top) {
- LScroll(0, cell.v - top, gURLList);
- } else if (cell.v >= bot) {
- LScroll(0, cell.v - bot + 1, gURLList);
- }
- }
-
-
- /*----------------------------------------------------------------------------
- URLHelpersFilter
-
- Filter proc for the URL Helper Programs topic.
-
- Entry: dlg = pointer to dialog.
- ev = pointer to event record.
-
- Exit: function result = true if event handled and item hit.
- *itemHit = item number of item hit.
- ev = pointer to possibly modified event record.
-
- This dialog filter handles the up and down arrow keys.
- ----------------------------------------------------------------------------*/
-
- static pascal Boolean URLHelpersFilter (DialogPtr dlg, EventRecord *ev,
- short *itemHit)
- {
- unsigned char theChar;
- Cell cell;
- short numCells;
-
- if (ev->what == keyDown || ev->what == autoKey) {
- theChar = ev->message & charCodeMask;
- if (theChar == upArrow || theChar == downArrow) {
- numCells = (**gURLList).dataBounds.bottom;
- if (numCells > 0) {
- cell.h = 0;
- cell.v = GetFirstSelectedCell(gURLList);
- if (cell.v == -1 && theChar == upArrow) cell.v = numCells;
- if (theChar == downArrow) {
- cell.v++;
- } else {
- cell.v--;
- }
- if (cell.v < 0) {
- cell.v = 0;
- } else if (cell.v >= numCells) {
- cell.v = numCells - 1;
- }
- SelectSingleListItem(gURLList, cell);
- URLScrollIntoView();
- }
- AdjustURLButtons(dlg);
- ev->what = nullEvent;
- return false;
- }
- }
- return DialogFilter(dlg, ev, itemHit);
- }
-
-
-
- /*----------------------------------------------------------------------------
- URLHelpers
-
- Handles the URL helper programs preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean URLHelpers (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- short itemType;
- Rect box;
- Handle itemHandle;
- Rect dataBounds;
- Point cSize, cell, where;
- TURLHelperInfo *p;
- short numHelpers;
- char appName[32];
- CStr255 str, fmt, msg;
- short i;
- long len;
- TURLSchemeName schemeName;
- char *c;
- short cmp;
- TURLHelperInfo newHelper;
- OSErr err = noErr;
- StandardFileReply reply;
-
- switch (item) {
-
- case kInit:
-
- GetDialogItem(dlg, kURLList, &itemType, &itemHandle, &box);
- InsetRect(&box, 1, 1);
- box.right -= 15;
- numHelpers = 0;
- for (p = *prefs->urlHelpers; *p->schemeName != 0; p++) numHelpers++;
- SetRect(&dataBounds, 0, 0, 1, numHelpers);
- SetPt(&cSize, 0, 0);
- gURLList = LNew(&box, &dataBounds, cSize, 0, dlg, false, false, false, true);
- (**gURLList).selFlags = lOnlyOne;
- SetPt(&cell, 0, 0);
- MyHLock(prefs->urlHelpers);
- FastQSort(*prefs->urlHelpers, numHelpers, sizeof(TURLHelperInfo),
- CompareURLHelperInfo);
- for (p = *prefs->urlHelpers; *p->schemeName != 0; p++) {
- *appName = 0;
- if (p->sig != 0) FindAppNameFromSig(p->sig, (StringPtr)appName);
- p2cstr((StringPtr)appName);
- sprintf(str, "%s — %s", p->schemeName, appName);
- LSetCell(str, strlen(str), cell, gURLList);
- cell.v++;
- }
- MyHUnlock(prefs->urlHelpers);
- SetPt(&cell, 0, 0);
- LSetSelect(true, cell, gURLList);
- LSetDrawingMode(true, gURLList);
- DlgSetUserItem(dlg, kURLList, gDrawURLListUPP);
- SetItemURLSchemeName(dlg, kURLNewScheme);
- SetItemMaxLength(dlg, kURLNewScheme, kMaxSchemeNameLen);
- DlgSetCheck(dlg, kURLUseWebHelper, prefs->useWebHelperForHtmlFiles);
- AdjustURLButtons(dlg);
- break;
-
- case kTerm:
-
- prefs->useWebHelperForHtmlFiles = DlgGetCheck(dlg, kURLUseWebHelper);
- LDispose(gURLList);
- break;
-
- case kURLList:
-
- where = gCurEvent.where;
- GlobalToLocal(&where);
- GetDialogItem(dlg, kURLList, &itemType, &itemHandle, &box);
- InsetRect(&box, 1, 2);
- if (PtInRect(where, &box)) {
- if (LClick(where, gCurEvent.modifiers, gURLList))
- SetNewURLHelper(prefs);
- }
- AdjustURLButtons(dlg);
- break;
-
- case kURLChangeButton:
-
- SetNewURLHelper(prefs);
- break;
-
- case kURLDeleteButton:
-
- i = GetFirstSelectedCell(gURLList);
- if (i < 0) break;
- len = MyGetHandleSize(prefs->urlHelpers);
- BlockMoveData(
- *prefs->urlHelpers + i + 1,
- *prefs->urlHelpers + i,
- len - (i+1) * sizeof(TURLHelperInfo));
- MySetHandleSize(prefs->urlHelpers, len - sizeof(TURLHelperInfo));
- LDelRow(1, i, gURLList);
- if (i >= (**gURLList).dataBounds.bottom) i--;
- if (i >= 0) {
- SetPt(&cell, 0, i);
- SelectSingleListItem(gURLList, cell);
- URLScrollIntoView();
- }
- AdjustURLButtons(dlg);
- break;
-
- case kURLNewScheme:
-
- AdjustURLButtons(dlg);
- break;
-
- case kURLAddButton:
-
- DlgGetCString(dlg, kURLNewScheme, schemeName);
- if (*schemeName == 0) break;
- for (c = schemeName; *c != 0; c++) *c = tolower(*c);
- if (MyStrCmp(schemeName, "nntp") == 0 || MyStrCmp(schemeName, "news") == 0 ||
- MyStrCmp(schemeName, "mailto") == 0)
- {
- StopAlertNumber(kStrCantRedefineBuiltinURLs);
- return true;
- }
- for (i = 0, p = *prefs->urlHelpers; *p->schemeName != 0; i++, p++) {
- cmp = MyStrCmp(schemeName, p->schemeName);
- if (cmp < 0) break;
- if (cmp == 0) {
- SetPt(&cell, 0, i);
- SelectSingleListItem(gURLList, cell);
- MyLScrollCellIntoView(cell, gURLList);
- GetCString(kStrURLSchemeAlreadyDefined, fmt);
- sprintf(msg, fmt, schemeName);
- StopAlertMessage(msg);
- return true;
- }
- }
- MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
- if (!reply.sfGood) return true;
- if (!ValidHelper(&reply.sfFile)) return true;
- if (ValidURLHelper(&reply.sfFile, &newHelper)) {
- len = MyGetHandleSize(prefs->urlHelpers);
- err = MySetHandleSize(prefs->urlHelpers, len + sizeof(TURLHelperInfo));
- if (err != noErr) {
- StopAlertNumber(kStrOutOfMemory);
- return true;
- }
- BlockMoveData(
- *prefs->urlHelpers + i,
- *prefs->urlHelpers + i + 1,
- len - i * sizeof(TURLHelperInfo));
- strcpy(newHelper.schemeName, schemeName);
- (*prefs->urlHelpers)[i] = newHelper;
- LAddRow(1, i, gURLList);
- SetPt(&cell, 0, i);
- *appName = 0;
- if (newHelper.sig != 0) FindAppNameFromSig(newHelper.sig, (StringPtr)appName);
- p2cstr((StringPtr)appName);
- sprintf(str, "%s — %s", schemeName, appName);
- LSetCell(str, strlen(str), cell, gURLList);
- SelectSingleListItem(gURLList, cell);
- MyLScrollCellIntoView(cell, gURLList);
- DlgSetCString(dlg, kURLNewScheme, "");
- AdjustURLButtons(dlg);
- }
- break;
-
- case kURLUseWebHelper:
-
- DlgToggleCheck(dlg, item);
- break;
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- Auth
-
- Handles the authorization preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean Auth (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- CStr255 tempStr;
- short len;
-
- switch (item) {
-
- case kInit:
-
- DlgSetCString(dlg, kAuthUsername, prefs->authUsername);
- SetItemUSAsciiNoBlank(dlg, kAuthUsername);
- SetItemMaxLength(dlg, kAuthUsername, 31);
- len = strlen(prefs->authPassword);
- memset(tempStr, '•', len);
- tempStr[len] = 0;
- DlgSetCString(dlg, kAuthPassword, tempStr);
- SetItemPassword(dlg, kAuthPassword, prefs->authPassword);
- SetItemMaxLength(dlg, kAuthPassword, 31);
- DlgSetCheck(dlg, kAuthSavePassword, prefs->authSavePassword);
- DlgSetCheck(dlg, kAuthPrivateGroups, prefs->authPrivateGroups);
- DlgSetCtlValue(dlg, prefs->authAtStartup ? kAuthAtStartup :
- kAuthWhenRequested, 1);
- if (*prefs->authUsername == 0) {
- SelectDialogItemText(dlg, kAuthUsername, 0, 0);
- } else if (*prefs->authPassword == 0) {
- SelectDialogItemText(dlg, kAuthPassword, 0, 0);
- } else {
- SelectDialogItemText(dlg, kAuthUsername, 0, 0x7fff);
- }
- break;
-
- case kTerm:
-
- DlgGetCString(dlg, kAuthUsername, prefs->authUsername);
- prefs->authSavePassword = DlgGetCheck(dlg, kAuthSavePassword);
- prefs->authPrivateGroups = DlgGetCheck(dlg, kAuthPrivateGroups);
- prefs->authAtStartup = DlgGetCtlValue(dlg, kAuthAtStartup) == 1;
- break;
-
- case kAuthSavePassword:
- case kAuthPrivateGroups:
-
- DlgToggleCheck(dlg, item);
- break;
-
- case kAuthAtStartup:
-
- if (DlgGetCtlValue(dlg, kAuthAtStartup) == 0) {
- DlgSetCtlValue(dlg, kAuthAtStartup, 1);
- DlgSetCtlValue(dlg, kAuthWhenRequested, 0);
- }
- break;
-
- case kAuthWhenRequested:
-
- if (DlgGetCtlValue(dlg, kAuthWhenRequested) == 0) {
- DlgSetCtlValue(dlg, kAuthWhenRequested, 1);
- DlgSetCtlValue(dlg, kAuthAtStartup, 0);
- }
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- Extract
-
- Handles the extracting binaries preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean Extract (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- StandardFileReply reply;
- FInfo fInfo;
- long dirID;
- Str31 name;
- OSErr err = noErr;
- CInfoPBRec pb;
- Boolean valid;
- AliasHandle alias;
-
- switch (item) {
-
- case kInit:
-
- DlgSetCheck(dlg, kSavedBinDirCheckBox, prefs->savedBinDefaultFolder);
- DlgSetUserItem(dlg, kSavedBinDirBorder, gDlgGrayBorderItemUPP);
- ValidateSavedFolderAlias(prefs->savedBinDefaultFolderAlias,
- &pb.dirInfo.ioVRefNum, &pb.dirInfo.ioDrDirID, &valid);
- if (valid) {
- pb.dirInfo.ioNamePtr = name;
- pb.dirInfo.ioFDirIndex = -1;
- err = PBGetCatInfo(&pb, false);
- } else {
- *name = 0;
- }
- DlgSetPString(dlg, kSavedBinDirName, name);
- DlgEnableItem(dlg, kSavedBinDirButton, prefs->savedBinDefaultFolder);
-
- DlgSetUserItem(dlg, kHqxAppBorder, gDlgGrayBorderItemUPP);
- err = FindAppNameFromSig(prefs->hqxHelper, name);
- if (err == noErr) {
- DlgSetPString(dlg, kHqxAppName, name);
- CopyPascalString(prefs->hqxHelperName, name);
- } else {
- DlgSetPString(dlg, kHqxAppName, prefs->hqxHelperName);
- }
-
- DlgSetUserItem(dlg, kUUAppBorder, gDlgGrayBorderItemUPP);
- err = FindAppNameFromSig(prefs->uuHelper, name);
- if (err == noErr) {
- DlgSetPString(dlg, kUUAppName, name);
- CopyPascalString(prefs->uuHelperName, name);
- } else {
- DlgSetPString(dlg, kUUAppName, prefs->uuHelperName);
- }
-
- break;
-
- case kTerm:
-
- break;
-
- case kSavedBinDirCheckBox:
-
- DlgToggleCheck(dlg, item);
- prefs->savedBinDefaultFolder = DlgGetCheck(dlg, item);
- DlgEnableItem(dlg, kSavedBinDirButton, prefs->savedBinDefaultFolder);
- break;
-
- case kSavedBinDirButton:
-
- MyStandardGetDirectory(&reply, &dirID);
- if (!reply.sfGood) break;
- err = NewAlias(nil, &reply.sfFile, &alias);
- if (err == noErr) {
- MyDisposeHandle(prefs->savedBinDefaultFolderAlias);
- prefs->savedBinDefaultFolderAlias = alias;
- }
- DlgSetPString(dlg, kSavedBinDirName, reply.sfFile.name);
- break;
-
- case kHqxAppButton:
-
- MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
- if (!reply.sfGood) break;
- if (!ValidHelper(&reply.sfFile)) break;
- FSpGetFInfo(&reply.sfFile, &fInfo);
- prefs->hqxHelper = fInfo.fdCreator;
- CopyPascalString(prefs->hqxHelperName, reply.sfFile.name);
- DlgSetPString(dlg, kHqxAppName, prefs->hqxHelperName);
- break;
-
- case kUUAppButton:
-
- MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
- if (!reply.sfGood) break;
- if (!ValidHelper(&reply.sfFile)) break;
- FSpGetFInfo(&reply.sfFile, &fInfo);
- prefs->uuHelper = fInfo.fdCreator;
- CopyPascalString(prefs->uuHelperName, reply.sfFile.name);
- DlgSetPString(dlg, kUUAppName, prefs->uuHelperName);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MiscOptions
-
- Handle the miscellaneous options preferences dialog.
-
- Entry: prefs = pointer to new prefs.
- dlg = pointer to dialog.
- item = item number hit.
-
- Exit: function result = false if item == kTerm and one of the
- prefs is invalid, true otherwise.
- ----------------------------------------------------------------------------*/
-
- static Boolean MiscOptions (TPrefRec *prefs, DialogPtr dlg, short item)
- {
- switch (item) {
-
- case kInit:
-
- DlgSetCheck(dlg, kReZoomWindows, prefs->reZoomWindows);
- DlgSetCheck(dlg, kCheckNewGroups, prefs->checkForNewGroups);
- DlgSetCheck(dlg, kAreYouSure, prefs->areYouSureAlert);
- DlgSetCheck(dlg, kLogActionsToFile, prefs->logActionsToFile);
- DlgSetCheck(dlg, kDontCoverFinderIcons, prefs->dontCoverFinderIcons);
- DlgSetCheck(dlg, kUseInternetConfig, prefs->useInternetConfig);
- break;
-
- case kTerm:
-
- prefs->reZoomWindows = DlgGetCheck(dlg, kReZoomWindows);
- prefs->checkForNewGroups = DlgGetCheck(dlg, kCheckNewGroups);
- prefs->areYouSureAlert = DlgGetCheck(dlg, kAreYouSure);
- prefs->logActionsToFile = DlgGetCheck(dlg, kLogActionsToFile);
- prefs->dontCoverFinderIcons = DlgGetCheck(dlg, kDontCoverFinderIcons);
- prefs->useInternetConfig = DlgGetCheck(dlg, kUseInternetConfig);
- break;
-
- case kReZoomWindows:
- case kCheckNewGroups:
- case kAreYouSure:
- case kLogActionsToFile:
- case kDontCoverFinderIcons:
- case kUseInternetConfig:
-
- DlgToggleCheck(dlg, item);
- break;
-
- }
-
- return true;
- }
-
-
-
- /*----------------------------------------------------------------------------
- DrawGrayOutline
-
- A user item procedure to draw the gray outline.
-
- Entry: dlg = pointer to dialog.
- item = item number of gray outline user item.
- ----------------------------------------------------------------------------*/
-
- static pascal void DrawGrayOutline (DialogPtr dlg, short item)
- {
- Handle itemHandle;
- ControlHandle popupCtl;
- short itemType;
- Rect box, popupBox, r;
-
- GetDialogItem(dlg, item, &itemType, &itemHandle, &box);
- GetDialogItem(dlg, kTopicPopup, &itemType, (Handle*)&popupCtl, &popupBox);
- popupBox = (**popupCtl).contrlRect;
- r = box;
- r.bottom = r.top + 1;
- r.right = popupBox.left - 1;
- DrawGrayRect(&r);
- r = box;
- r.bottom = r.top + 1;
- r.left = popupBox.right + 5;
- DrawGrayRect(&r);
- r = box;
- r.right = r.left + 1;
- DrawGrayRect(&r);
- r = box;
- r.left = r.right - 1;
- DrawGrayRect(&r);
- r = box;
- r.top = r.bottom - 1;
- DrawGrayRect(&r);
- }
-
-
-
- /*----------------------------------------------------------------------------
- DrawArrows
-
- A user item procedure to draw the arrows.
-
- Entry: dlg = pointer to dialog.
- item = item number.
- ----------------------------------------------------------------------------*/
-
- static pascal void DrawArrows (DialogPtr dlg, short item)
- {
- short itemType;
- Handle itemHandle;
- Rect box;
-
- GetDialogItem(dlg, kArrows, &itemType, &itemHandle, &box);
- FrameRoundRect(&box, 8, 8);
- DrawArrowPair(gArrowPair);
- }
-
-
-
- /*----------------------------------------------------------------------------
- TrackArrowClick
-
- Track a click on the arrows user item.
-
- Entry: dlg = pointer to dialog.
- curTopic = current topic number.
-
- Exit: function result = new topic number.
- ----------------------------------------------------------------------------*/
-
- static short TrackArrowClick (DialogPtr dlg, short curTopic)
- {
- short itemType;
- Rect box;
- Handle itemHandle;
- short delta;
- short newTopic;
-
- delta = TrackArrowPair(gArrowPair);
- newTopic = curTopic + delta;
- if (newTopic < 1) newTopic = 1;
- if (newTopic > kNumTopics) newTopic = kNumTopics;
- if (newTopic != curTopic) {
- GetDialogItem(dlg, kTopicPopup, &itemType, &itemHandle, &box);
- SetControlValue((ControlHandle)itemHandle, newTopic);
- }
- return newTopic;
- }
-
-
-
- /*----------------------------------------------------------------------------
- DoPreferences
-
- Presents the Preferences dialog.
-
- Exit: function result = error code.
- ----------------------------------------------------------------------------*/
-
- OSErr DoPreferences (void)
- {
- typedef Boolean (*prefsFuncPtr) (TPrefRec *prefs, DialogPtr dlg, short item);
-
- static prefsFuncPtr prefsFuncPtrs[] = {
- NewsreadingOptions,
- Server,
- ServerOptions,
- Personal,
- Signature,
- MessageOptions,
- ExtraHeaderLines,
- Remote,
- ScreenFonts,
- PrintingFont,
- SavedUGL,
- SavedArt,
- SavedMsg,
- URLHelpers,
- Auth,
- Extract,
- MiscOptions,
- };
-
- static short curTopic = kNewsreadingOptions;
-
- short newTopic;
- prefsFuncPtr theFunc;
- TPrefRec *prefs = nil;
- DialogPtr dlg = nil;
- Boolean reauthenticate = false;
- Handle theDITL;
- Point newLocn;
- OSErr err = noErr;
- GrafPtr port;
- Boolean valid;
- short itemType;
- Handle itemHandle;
- Rect box, arrowRect, backwardHotRect, forwardHotRect;
-
- GetPort(&port);
-
- MyICReadSharedPrefs(kICAllSharedPrefs);
- err = MyNewPtr(sizeof(TPrefRec), &prefs);
- if (err != noErr) goto exit;
- *prefs = gPrefs;
- if (prefs->savedMsgDefaultFolderAlias != nil) {
- err = MyHandToHand(&prefs->savedMsgDefaultFolderAlias);
- if (err != noErr) {
- prefs->savedMsgDefaultFolderAlias = nil;
- prefs->savedArtDefaultFolderAlias = nil;
- prefs->savedBinDefaultFolderAlias = nil;
- prefs->savedUGLDefaultFolderAlias = nil;
- goto exit;
- }
- }
- if (prefs->savedArtDefaultFolderAlias != nil) {
- err = MyHandToHand(&prefs->savedArtDefaultFolderAlias);
- if (err != noErr) {
- prefs->savedArtDefaultFolderAlias = nil;
- prefs->savedBinDefaultFolderAlias = nil;
- prefs->savedUGLDefaultFolderAlias = nil;
- goto exit;
- }
- }
- if (prefs->savedBinDefaultFolderAlias != nil) {
- err = MyHandToHand(&prefs->savedBinDefaultFolderAlias);
- if (err != noErr) {
- prefs->savedBinDefaultFolderAlias = nil;
- prefs->savedUGLDefaultFolderAlias = nil;
- goto exit;
- }
- }
- if (prefs->savedUGLDefaultFolderAlias != nil) {
- err = MyHandToHand(&prefs->savedUGLDefaultFolderAlias);
- if (err != noErr) {
- prefs->savedUGLDefaultFolderAlias = nil;
- goto exit;
- }
- }
- if (prefs->urlHelpers != nil) {
- err = MyHandToHand(&prefs->urlHelpers);
- if (err != noErr) {
- prefs->urlHelpers = nil;
- goto exit;
- }
- }
-
- err = MyGetNewDialog(kPrefsDlg, ok, cancel, &dlg);
- if (err != noErr) goto exit;
- SetPort(dlg);
- RestoreMovableModalDialogPosition(dlg, gPrefs.prefsLoc);
-
- GetDialogItem(dlg, kArrows, &itemType, &itemHandle, &box);
- SetRect(&arrowRect, box.left + 2, box.top + 3, box.left + 12, box.top + 21);
- backwardHotRect = forwardHotRect = box;
- backwardHotRect.bottom = forwardHotRect.top = box.top + 13;
- backwardHotRect.top++;
- forwardHotRect.bottom++;
- err = CreateArrowPair(true, &arrowRect, &backwardHotRect,
- &forwardHotRect, &gArrowPair);
- if (err != noErr) goto exit;
- EnableOrDisableArrowPair(gArrowPair, -1, curTopic > 1);
- EnableOrDisableArrowPair(gArrowPair, +1, curTopic < kNumTopics);
-
- for (gItem = kFirstGrayLine; gItem <= kLastGrayLine; gItem++)
- DlgSetUserItem(dlg, gItem, gDlgGrayBorderItemUPP);
- DlgSetUserItem(dlg, kArrows, gDlgArrowsItemUPP);
- if (curTopic == kScreenFonts || curTopic == kPrintingFont) SetCursor(&gWatchCurs);
- err = MyGetResource('DITL', kPrefsDlg + curTopic, &theDITL);
- if (err == noErr) err = MyAppendDITL(dlg, theDITL, overlayDITL);
- InitCursor();
- if (err != noErr) goto exit;
- MyReleaseResource(theDITL);
- DlgSetCtlValue(dlg, kTopicPopup, curTopic);
- theFunc = prefsFuncPtrs[curTopic - 1];
- (*theFunc)(prefs, dlg, kInit);
- DlgSetDefaultButtonOutline(dlg, curTopic != kSignature && curTopic != kExtraHeaderLines);
-
- while (true) {
- MyMovableModalDialog(dlg,
- curTopic == kURLHelpers ? URLHelpersFilter : DialogFilter,
- &gItem);
- if (gItem == ok || gItem == cancel) {
- valid = (*theFunc)(prefs, dlg, kTerm);
- if (valid || gItem == cancel) break;
- } else if (gItem == kTopicPopup || gItem == kArrows) {
- if (gItem == kTopicPopup) {
- newTopic = DlgGetCtlValue(dlg, kTopicPopup);
- } else {
- newTopic = TrackArrowClick(dlg, curTopic);
- }
- if (newTopic != curTopic) {
- valid = (*theFunc)(prefs, dlg, kTerm);
- if (valid) {
- curTopic = newTopic;
- EnableOrDisableArrowPair(gArrowPair, -1, curTopic > 1);
- EnableOrDisableArrowPair(gArrowPair, +1, curTopic < kNumTopics);
- MyShortenDITL(dlg, CountDITL(dlg) - kCommonItems);
- if (curTopic == kScreenFonts || curTopic == kPrintingFont) SetCursor(&gWatchCurs);
- err = MyGetResource('DITL', kPrefsDlg + curTopic, &theDITL);
- if (err == noErr) err = MyAppendDITL(dlg, theDITL, overlayDITL);
- InitCursor();
- if (err != noErr) goto exit;
- MyReleaseResource(theDITL);
- theFunc = prefsFuncPtrs[curTopic - 1];
- (*theFunc)(prefs, dlg, kInit);
- DlgSetDefaultButtonOutline(dlg,
- curTopic != kSignature && curTopic != kExtraHeaderLines);
- } else {
- GetDialogItem(dlg, kTopicPopup, &itemType, &itemHandle, &box);
- SetControlValue((ControlHandle)itemHandle, curTopic);
- }
- }
- } else {
- (*theFunc)(prefs, dlg, gItem);
- }
- }
-
- SaveMovableModalDialogPosition(dlg, &newLocn);
-
- DisposeArrowPair(gArrowPair);
- gArrowPair = nil;
-
- err = DoClose(dlg);
- dlg = nil;
- if (err != noErr) goto exit;
-
- if (gItem == ok) {
- if (prefs->logActionsToFile && !gPrefs.logActionsToFile) {
- OpenLogFile();
- } else if (!prefs->logActionsToFile && gPrefs.logActionsToFile) {
- CloseLogFile();
- }
- if (!EqualString(prefs->newsServerName, gPrefs.newsServerName, false, true)) {
- NoteMessageNumber(kStrMustRestart);
- }
- if (prefs->useInternetConfig != gPrefs.useInternetConfig) {
- NoteMessageNumber(kStrMustRestartIC);
- }
- reauthenticate = strcmp(prefs->authUsername, gPrefs.authUsername) != 0 ||
- strcmp(prefs->authPassword, gPrefs.authPassword) != 0 ||
- prefs->authAtStartup && !gPrefs.authAtStartup;
- MyDisposeHandle(gPrefs.savedMsgDefaultFolderAlias);
- MyDisposeHandle(gPrefs.savedArtDefaultFolderAlias);
- MyDisposeHandle(gPrefs.savedBinDefaultFolderAlias);
- MyDisposeHandle(gPrefs.savedUGLDefaultFolderAlias);
- MyDisposeHandle(gPrefs.urlHelpers);
- gPrefs = *prefs;
- MyICWriteSharedPrefs(kICAllSharedPrefs);
- ResetNewsServerOptions();
- AdjustExtractBinariesCommand();
- } else {
- MyDisposeHandle(prefs->savedMsgDefaultFolderAlias);
- MyDisposeHandle(prefs->savedArtDefaultFolderAlias);
- MyDisposeHandle(prefs->savedBinDefaultFolderAlias);
- MyDisposeHandle(prefs->savedUGLDefaultFolderAlias);
- MyDisposeHandle(prefs->urlHelpers);
- }
- MyDisposePtr(prefs);
- prefs = nil;
- gPrefs.prefsLoc = newLocn;
- if (reauthenticate && gStartupOK) {
- err = ReAuthenticate();
- if (err != noErr) goto exit;
- if (gPrefs.authPrivateGroups) {
- err = DoRebuildFullGroupList();
- if (err != noErr) goto exit;
- }
- }
- SetPort(port);
- return noErr;
-
- exit:
-
- DisposeArrowPair(gArrowPair);
- if (dlg != nil) DoClose(dlg);
- if (prefs != nil) {
- MyDisposeHandle(prefs->savedMsgDefaultFolderAlias);
- MyDisposeHandle(prefs->savedArtDefaultFolderAlias);
- MyDisposeHandle(prefs->savedBinDefaultFolderAlias);
- MyDisposeHandle(prefs->savedUGLDefaultFolderAlias);
- MyDisposeHandle(prefs->urlHelpers);
- MyDisposePtr(prefs);
- }
- SetPort(port);
- return err;
- }
-
-
-
- /*----------------------------------------------------------------------------
- prefsdlog_InitUPP
-
- Initialize UPPs.
- ----------------------------------------------------------------------------*/
-
- void prefsdlog_InitUPP (void)
- {
- gInvisibleFilesFilterUPP = NewFileFilterYDProc(InvisibleFilesFilter);
- gDrawFontSampleUPP = NewUserItemProc(DrawFontSample);
- gDlgArrowsItemUPP = NewUserItemProc(DrawArrows);
- gDrawURLListUPP = NewUserItemProc(DrawURLList);
- }